﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Reflection;

namespace AgendaManager.Service
{
    public class ContactoDAO : DAOBase
    {
        public static Contacto NuevoContacto(Contacto contacto, FotoContacto fotoContacto)
        {
            try
            {
                int contactoId = GetNextId(contacto);

                if (contactoId != 0)
                {
                    contacto.Id = contactoId;
                    if (CreateEntity(contacto))
                    {
                        int fotoContactoId = GetNextId(fotoContacto);
                        fotoContacto.IdContacto = contacto.Id;
                        CreateEntity(fotoContacto);
                    }

                    return contacto;
                }
                else
                    throw new Exception("No se pudo obtener el siguiente id de la entidad: Caño");
            }
            catch (Exception)
            {
                
                throw;
            }
        }


        internal static bool NuevaFoto(FotoContacto fotoContacto)
        {
            try
            {
                int fotoContactoId = GetNextId(fotoContacto);

                if (fotoContactoId != 0)
                {
                    fotoContacto.Id = fotoContactoId;
                    return CreateEntity(fotoContacto);
                }

                return false;
            }
            catch (Exception)
            {

                throw;
            }
        }
        internal static Contacto NuevoContacto(Contacto contacto, FotoContacto fotoContacto, List<ObraContacto> obraContactos)
        {
            try
            {
                int contactoId = GetNextId(contacto);

                if (contactoId != 0)
                {
                    contacto.Id = contactoId;
                    if (CreateEntity(contacto))
                    {
                        try
                        {
                            int fotoContactoId = GetNextId(fotoContacto);
                            fotoContacto.IdContacto = contacto.Id;
                            CreateEntity(fotoContacto);
                        }
                        catch (Exception)
                        {
                        }
                        try
                        {
                            foreach (ObraContacto obraContacto in obraContactos)
                            {
                                int obraContactoId = GetNextId(obraContacto);
                                obraContacto.Id = obraContactoId;
                                obraContacto.IdContacto = contacto.Id;

                                CreateEntity(obraContacto);
                            }
                        }
                        catch (Exception)
                        {
                        }
                    }

                    return contacto;
                }
                else
                    throw new Exception("No se pudo obtener el siguiente id de la entidad: Caño");
            }
            catch (Exception)
            {

                throw;
            }
        }

        internal static List<Contacto> RetrieveEntities(object dto, string filtro)
        {
            List<Contacto> dtos = new List<Contacto>();

            DataTable dt = GetDataTable(dto, filtro);

            if (dt.Rows.Count > 0)
                dtos = LlenarContactos(dto, dt);

            return dtos;
        }

        private static List<Contacto> LlenarContactos(object dto, DataTable dt)
        {
            List<Contacto> dtos = new List<Contacto>();

            foreach (DataRow dr in dt.Rows)
            {
                Contacto aux = new Contacto();
                PoblarObjetoDesdeDataRow(aux, dr);

                dtos.Add(aux);
            }

            return dtos;
        }

        internal static FotoContacto GetFotoContacto(int contactoId)
        {
            FotoContacto foto = new FotoContacto();

            DataTable dt = GetDataTable(foto, string.Format("{0}", contactoId));
            if (dt.Rows.Count > 0)
            {
                foto = LlenarFoto(foto, dt).First();
            }

            return foto;
        }

        private static List<FotoContacto> LlenarFoto(FotoContacto foto, DataTable dt)
        {
            List<FotoContacto> fotos = new List<FotoContacto>();

            foreach (DataRow dr in dt.Rows)
            {
                FotoContacto aux = new FotoContacto();
                PoblarObjetoDesdeDataRow(aux, dr);

                fotos.Add(aux);
            }

            return fotos;
        }

        internal static object RetrieveEntitiesWhere(object dto, string where)
        {
            throw new NotImplementedException();
        }

        internal static bool Update(object dto)
        {
            try
            {
                return DAOBase.UpdateEntity(dto);
            }
            catch (Exception)
            {

                throw;
            }
        }
    }
}